#include <fstream>
#include <io.h>
#include "Record.h"
#include "Exception.h"
#include "json.hpp"

using namespace nlohmann;

// 图书借阅记录列表
list<Record> Record::RecordList = list<Record>();
// 关联的文件名
const char *Record::file_name = "data/records.txt";
/**
 * @brief 借阅记录的构造函数
 *
 * @param b 图书
 * @param r 借阅人
 */
Record::Record(const Reader &r, const Book &b)
{
    book_id = b.id;
    reader_id = r.id;
}

Record::Record(const int reader_id, const int book_id)
{
    this->book_id = book_id;
    this->reader_id = reader_id;
}

/**
 * @brief 判断两个是否为同一条记录
 *
 * @param a
 * @param b
 * @return true
 * @return false
 */
bool operator==(const Record &a, const Record &b)
{
    return a.book_id == b.book_id && a.reader_id == b.reader_id;
}
/**
 * @brief 借书
 *
 * @param b
 * @param r
 */
void Record::borrow(const Reader &r, const Book &b)
{
    Record record(r, b);
    // 判断记录是否存在
    for (auto it = RecordList.begin(); it != RecordList.end(); it++)
    {
        if (*it == record)
        {
            // 记录存在
            throw BorrowError("读者" + r.name + "已经借阅了《" + b.name + "》，请不要重复借阅操作");
        }
    }
    RecordList.push_back(record);
}
/**
 * @brief 还书
 *
 * @param b
 * @param r
 */
void Record::return_(const Reader &r, const Book &b)
{
    Record record(r, b);
    // 判断记录是否存在
    for (auto it = RecordList.begin(); it != RecordList.end(); it++)
    {
        if (*it == record)
        {
            // 记录存在
            RecordList.remove(record);
            return;
        }
    }
    // 记录不存在
    throw BorrowError("没有读者" + r.name + "已经借阅《" + b.name + "》的记录，请不要重复归还操作");
}

/**
 * @brief 借书
 * 
 */
void Record::borrowBook()
{
    // TODO 
    // 要求用户输入用户名
    // 要求用户输入密码
    // 输入ISDN
    // 判断图书是否存在
    // 借书
    
    // 写入文件
    saveFile();
}

/**
 * @brief 还书
 * 
 */
void Record::returnBook()
{
    // TODO 
    // 要求用户输入用户名
    // 输入ISDN
    // 判断图书是否存在是否被此用户借走
    // 还书

    // 写入文件
    saveFile();
}

/**
 * @brief 转换为json表示
 *
 * @return string
 */
string Record::toJson()
{
    json json_array = json::array();
    for (auto iter = RecordList.begin(); iter != RecordList.end(); iter++)
    {
        json json_item = {{"reader_id", iter->reader_id}, {"book_id", iter->book_id}};
        json_array.push_back(json_item);
    }
    return json_array.dump();
}

/**
 * @brief json 字符串转数组
 *
 * @return string
 */
list<Record> Record::fromJson(string json_str)
{
    json json_array = json::parse(json_str);
    list<Record> record_list;
    for (auto iter = json_array.begin(); iter != json_array.end(); iter++)
    {
        Record record = Record((int)(*iter)["reader_id"], (int)(*iter)["book_id"]);
        record_list.push_back(record);
    }
    return record_list;
}
/**
 * @brief 写入文件
 *
 */
void Record::saveFile()
{
    ofstream outfile;
    outfile.open(file_name, ios::out);
    outfile << toJson() << endl;
    outfile.close();
}
/**
 * @brief 加载文件
 *
 */
void Record::loadFromFile()
{
    cout << "加载借阅记录" << endl;
    if (_access(file_name, 0) == 0)
    {
        ifstream infile;
        string json_str;
        infile.open(file_name, ios::out);
        infile >> json_str;
        infile.close();
        RecordList = fromJson(json_str);
        cout << "加载了" << RecordList.size() << "条读借阅记录";
    }
    else
    {
        cout << "没有借阅列表文件" << endl;
    }
}
